/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import model.bean.*;
import model.daobase.DBase;

/**
 *
 * @author alulab
 */
public class DaoUsuario extends DBase {

    public int autentica(String correo, String clave) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        int iduser = 0;
        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (correo LIKE '" + correo + "') "
                    + "AND (clave LIKE md5('" + clave + "'))";

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();

            while (res.next()) {

                iduser = res.getInt(1);


            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {

            e1.getMessage();
        }





        return iduser;
    }

    public ArrayList<BeanUsuario> getUserList() {
        ArrayList<BeanUsuario> UserList = new ArrayList<BeanUsuario>();
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        BeanUsuario usuario = null;

        try {

            String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                    + " INNER JOIN estado e ON u.idestado=e.idestado WHERE u.idprivilegio=0";

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {
                usuario = new BeanUsuario();
                usuario.setIdusuario(res.getInt("idusuario"));
                usuario.setNombre(res.getString("nombre"));
                usuario.setApellido(res.getString("apellido"));
                usuario.setAlias(res.getString("alias"));
                usuario.setCorreo(res.getString("correo"));
                usuario.setFecha_registro(res.getDate("fecha_registro"));
                BeanPrivilegio privilegio = new BeanPrivilegio();
                privilegio.setIdprivilegio(res.getInt("idprivilegio"));
                privilegio.setNombre_privilegio(res.getString("nombre_privilegio"));
                usuario.setPrivilegio(privilegio);
                BeanEstado estado = new BeanEstado();
                estado.setIdestado(res.getInt("idestado"));
                estado.setNombre_estado(res.getString("nombre_estado"));
                usuario.setEstado(estado);
                usuario.setFecha_cambio_estado(res.getDate("fecha_cambio_estado"));

                UserList.add(usuario);
            }



            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return UserList;

    }

    public BeanUsuario get(Integer idusuario) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        BeanUsuario usuario = new BeanUsuario();

        try {

            String query = "select * FROM usuario u INNER JOIN privilegio p ON p.idprivilegio=u.idprivilegio"
                    + " INNER JOIN estado e ON u.idestado=e.idestado"
                    + " WHERE u.idusuario=" + idusuario;

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {
                usuario.setIdusuario(res.getInt("idusuario"));
                usuario.setNombre(res.getString("nombre"));
                usuario.setApellido(res.getString("apellido"));
                usuario.setAlias(res.getString("alias"));
                usuario.setCorreo(res.getString("correo"));
                usuario.setFecha_registro(res.getDate("fecha_registro"));
                BeanPrivilegio privilegio = new BeanPrivilegio();
                privilegio.setIdprivilegio(res.getInt("idprivilegio"));
                privilegio.setNombre_privilegio(res.getString("nombre_privilegio"));
                usuario.setPrivilegio(privilegio);
                BeanEstado estado = new BeanEstado();
                estado.setIdestado(res.getInt("idestado"));
                estado.setNombre_estado(res.getString("nombre_estado"));
                usuario.setEstado(estado);
                usuario.setFecha_cambio_estado(res.getDate("fecha_cambio_estado"));
            }



            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return usuario;

    }

    public void insert(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;



        try {

            String query = " INSERT INTO usuario(nombre,apellido,alias,correo,clave,fecha_registro,idprivilegio,idestado,ruta_foto,fecha_cambio_estado) "
                    + "VALUES(?,?,?,?,md5(?),now(),?,?,?,?)";


            pstmt = conn.prepareStatement(query);

            pstmt.setString(1, usuario.getNombre());
            pstmt.setString(2, usuario.getApellido());
            pstmt.setString(3, usuario.getAlias());
            pstmt.setString(4, usuario.getCorreo());
            pstmt.setString(5, usuario.getClave());
            pstmt.setInt(6, 0);
            pstmt.setInt(7, 1);
            pstmt.setString(8, "");
            pstmt.setDate(9, null);



            pstmt.executeUpdate();





            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }


    }

    public void delete(Integer idusuario) {

        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "DELETE FROM usuario WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void update_data(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        try {

            String query = "UPDATE usuario SET nombre='" + usuario.getNombre() + "', apellido='" + usuario.getApellido() + "', alias='" + usuario.getAlias()
                    + "', correo='" + usuario.getCorreo() + "' WHERE idusuario=" + usuario.getIdusuario();
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public void update_password(BeanUsuario usuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET clave=md5('" + usuario.getClave() + "') WHERE idusuario=" + usuario.getIdusuario();
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public boolean valida_password(BeanUsuario usuario, String pass) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        int iduser = 0;

        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (clave LIKE md5(?) AND idusuario = ? )";



            pstmt = conn.prepareStatement(query);

            pstmt.setString(1, pass);
            pstmt.setInt(2, usuario.getIdusuario());

            res = pstmt.executeQuery();

            while (res.next()) {

                iduser = res.getInt(1);


            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {

            e1.getMessage();
        }



        return iduser > 0;
    }

    public void block(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idestado=0, fecha_cambio_estado=now() WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void unblock(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idestado=1, fecha_cambio_estado=now() WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void nombra_moderador(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idprivilegio=1 WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public void desnombra_moderador(Integer idusuario) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET idprivilegio=0 WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }

    public String validausuario(BeanUsuario usuario, String clavetemp) {
        String aviso = "";

        DaoUsuario daousuario = new DaoUsuario();

        BeanEstado estado = new BeanEstado();
        BeanPrivilegio privilegio = new BeanPrivilegio();

        int idusuario = daousuario.validacorreo(usuario.getCorreo());
        int iduser = daousuario.validaalias(usuario.getAlias());
        boolean alfanumerico = daousuario.valida_caracter_alias(usuario.getAlias());
        boolean correo_valido = daousuario.valida_dominio_pucp(usuario.getCorreo());
        boolean nombre_valido = daousuario.valida_palabra(usuario.getNombre());
        boolean apellido_valido = daousuario.valida_palabra(usuario.getApellido());
//     boolean start_upcase = daousuario.mayuscula(usuario.getNombre());
//     boolean start_upcase2 = daousuario.mayuscula(usuario.getApellido()); 

        if (usuario.getNombre().isEmpty()) {
            aviso = "Ingrese su nombre";
        } else {
            if ((nombre_valido)) {

                if ((usuario.getNombre().length() > 1) && (usuario.getNombre().length() < 30)) {

                    if (usuario.getApellido().isEmpty()) {
                        aviso = "Ingrese su apellido " + "\n" + nombre_valido + " ";
                    } else {
                        if (apellido_valido) {
                            if ((usuario.getNombre().length() > 1) && (usuario.getNombre().length() < 30)) {

                                if (usuario.getAlias().isEmpty()) {
                                    aviso = "Nombre de Usuario no debe ser vacio";
                                } else {
                                    if (alfanumerico) {

                                        if ((usuario.getAlias().length() > 1) && (usuario.getAlias().length() < 15)) {
                                            if (iduser == 0) {
                                                if (usuario.getCorreo().isEmpty()) {
                                                    aviso = "Correo no debe ser vacio";
                                                } else {
                                                    if (correo_valido) {
                                                        if (idusuario == 0) {
                                                            if (usuario.getClave().isEmpty()) {
                                                                aviso = "ingrese una contraseña";
                                                            } else {
                                                                if (usuario.getClave().length() > 5) {
                                                                    if (usuario.getClave().equals(clavetemp)) {

                                                                        privilegio.setIdprivilegio(0);
                                                                        usuario.setPrivilegio(privilegio);

                                                                        estado.setIdestado(1);
                                                                        usuario.setEstado(estado);

                                                                        usuario.setRuta_foto(null);
                                                                        usuario.setFecha_cambio_estado(null);

                                                                    } else {
                                                                        aviso = "Las contraseñas no coinciden";
                                                                    }

                                                                } else {
                                                                    aviso = "debe tener una longitud mayor a 5";
                                                                }
                                                            }
                                                        } else {
                                                            aviso = "Correo ya registrado!";
                                                        }
                                                    } else {
                                                        aviso = "el correo debe ser @pucp.edu.pe o @pucp.pe" + " " + usuario.getCorreo() + correo_valido;
                                                    }
                                                }
                                            } else {
                                                aviso = "Usuario ya existe";
                                            }
                                        } else {
                                            aviso = "alias desbe tener mas de 2 y menos de 15\"";
                                        }
                                    } else {
                                        aviso = "Deben ser caracteres alfanumerico";
                                    }
                                }
                            } else {
                                aviso = "Nombre desbe tener mas de 2 y menos de 30";
                            }
                        } else {
                            aviso = "Ingrese un apellido valido y que empieze con mayuscula" + "\n" + apellido_valido + " ";
                        }
                    }
                } else {
                    aviso = "Nombre desbe tener mas de 2 y menos de 30";
                }
            } else {
                aviso = "Ingrese un nombre valido y que empieze con Mayusucla" + " " + usuario.getNombre() + " " + nombre_valido + "\n";
            }
        }
        return aviso;
    }

    public void registro(BeanUsuario usuario) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
//BeanUsuario usuario= new BeanUsuario();
        try {
            String query = "INSERT INTO usuario(nombre, apellido, alias, correo, clave, idprivilegio, idestado, ruta_foto, fecha_cambio_estado)"
                    + " VALUES('" + usuario.getNombre() + "','" + usuario.getApellido() + "','" + usuario.getAlias() + "','" + usuario.getCorreo() + "',md5('" + usuario.getClave() + "'),"
                    + " '" + usuario.getPrivilegio().getIdprivilegio() + "','" + usuario.getEstado().getIdestado() + "'," + usuario.getRuta_foto() + "," + usuario.getFecha_cambio_estado() + ");";

            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
//    return usuario;
    }

    public int validacorreo(String correo) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        int iduser = 0;
        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (correo LIKE '" + correo + "') ";
            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();

            while (res.next()) {
                iduser = res.getInt(1);
            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
        return iduser;
    }

    public int validaalias(String alias) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        int iduser = 0;
        try {
            String query =
                    "SELECT idusuario "
                    + "FROM usuario "
                    + "WHERE (alias LIKE '" + alias + "') ";

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {
                iduser = res.getInt(1);
            }

            res.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
        return iduser;
    }

    public boolean valida_caracter_alias(String temp) {

        Boolean valor = false;
//        if (temp.matches("[^a-z_A-Z_0-9]")){
        for (int i = 0; i < temp.length(); i++) {
            if ((temp.charAt(i) > 64 && temp.charAt(i) < 91) || (temp.charAt(i) > 96 && temp.charAt(i) < 123) || (temp.charAt(i) > 47 && temp.charAt(i) < 58)) {
                valor = true;
            } else {
                valor = false;
            }
        }
        return valor;
    }

    public boolean valida_palabra(String temp) {
        boolean aux = false;

        for (int i = 0; i < temp.length(); i++) {
            if ((temp.charAt(i) > 64 && temp.charAt(i) < 91) || (temp.charAt(i) > 96 && temp.charAt(i) < 123)) {


                aux = true;

            } else {
                aux = false;
            }
        }
        return aux;
    }

    public boolean valida_dominio_pucp(String temp) {

        Boolean valor = false;

        if ((temp.matches(".+@pucp.pe")) || (temp.matches(".+@pucp.edu.pe"))) {
//        if (temp.matches("[0-9a-zA-Z]([.w][0-9a-zA-Z])+@pucp.pe") || temp.matches("[0-9a-zA-Z]([.w][0-9a-zA-Z])+@pucp.edu.pe")) {
            valor = true;
        } else {
            valor = false;
        }
        return valor;
    }

    public void update_nick(int idusuario, String alias) {
        this.init_mysql();
        PreparedStatement pstmt = null;


        try {

            String query = "UPDATE usuario SET alias='" + alias + "' WHERE idusuario=" + idusuario;
            pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
    }

    public boolean mayuscula(String temp) {
        Boolean valor = true;

        String s = temp;

        String p = s.substring(0, 1);
        if (s.startsWith(p.toLowerCase())) {
            valor = false;
        } else {
            valor = true;
        }

        return valor;
    }

    public ArrayList<BeanArchivo> ArchivolistUser(int iduser) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> lista_archivos = new ArrayList<BeanArchivo>();


        try {

////            String query = "SELECT a.idarchivo, a.semestre, a.nota, a.like, a.num_descargas, u.idusuario, cu.nombre_curso, a.ruta, a.descripcion, a.fecha_subida, a.tamaño, e.nombre_estado, ta.idtipoarchivo "
////                    + "FROM archivo a "
////                    + "INNER JOIN curso cu ON cu.idcurso = a.idcurso "
////                    + "INNER JOIN estado e ON e.idestado = a.idestado "
////                    + "INNER JOIN usuario u ON u.idusuario = a.idusuario"
////                    + "INNER JOIN tipoarchivo ta ON ta.idtipoarchivo = a.idtipoarchivo";
//
////            String query = "SELECT * from archivo a INNER JOIN usuario u ON u.idusuario = a.idusuario";
//
//            String query = "SELECT a.idarchivo, a.semestre, a.nota, a.like, a.num_descargas, u.alias, cu.tag, a.ruta, a.descripcion, "
//                    + "a.fecha_subida, a.tamaño, e.idestado, ta.nombre_tipo "
//                    + "FROM archivo a "
//                    + "LEFT JOIN usuario u ON a.idusuario = u.idusuario"
//                    + "LEFT JOIN curso cu ON a.idcurso = cu.idcurso"
//                    + "LEFT JOIN estado e ON a.idestado = e.idestado"
//                    + "LEFT JOIN tipoarchivo ta ON a.idtipoarchivo = ta.idtipoarchivo"
//                    + "WHERE a.idusuario =" + iduser;

            
            
             String query = "SELECT a.idarchivo, a.semestre, a.nota, a.like, a.num_descargas, u.alias, cu.tag, "
                    + "a.fecha_subida, a.tamaño, e.idestado, ta.nombre_tipo "
                    + "FROM archivo a "
                    + "LEFT JOIN usuario u ON a.idusuario = u.idusuario"
                    + "LEFT JOIN curso cu ON a.idcurso = cu.idcurso"
                    + "LEFT JOIN estado e ON a.idestado = e.idestado"
                    + "LEFT JOIN tipoarchivo ta ON a.idtipoarchivo = ta.idtipoarchivo"
                    + "WHERE a.idusuario =" + iduser;
            
            
            

            pstmt = conn.prepareStatement(query);
            res = pstmt.executeQuery();

            BeanArchivo archivo;
            while (res.next()) {
                archivo = new BeanArchivo();
                archivo.setIdarchivo(res.getInt(1));
                archivo.setSemestre(res.getString(2));
                archivo.setNota(res.getInt(3));
                archivo.setLike(res.getInt(4));
                archivo.setNum_descargas(res.getInt(5));

                archivo.setUsuario(new BeanUsuario());
                archivo.getUsuario().setAlias(res.getString(6));

//                BeanUsuario busuario = new BeanUsuario();
//                busuario.setAlias(res.getString(6));
//                archivo.setUsuario(busuario);

                archivo.setCurso(new BeanCurso());
                archivo.getCurso().setTag(res.getString(7));

//                BeanCurso curso = new BeanCurso();
//                curso.setTag(res.getString(7));
////                curso.setNombre_curso(res.getString(7));
//                archivo.setCurso(curso);

               
//                BeanEstado estado = new BeanEstado();
//                estado.setNombre_estado(res.getString(8));
////                estado.setNombre_estado(res.getString(12));
//                archivo.setEstado(estado);

//                archivo.setRuta(res.getString(8));
//                archivo.setDescripcion(res.getString(9));
                archivo.setFecha_subida(res.getDate(8));
                archivo.setTamaño(res.getDouble(9));

                 archivo.setEstado(new BeanEstado());
                 archivo.getEstado().setIdestado(res.getInt(10));
                
                archivo.setTipoarchivo(new BeanTipoArchivo());
                archivo.getTipoarchivo().setNombre_tipo(res.getString(11));

//                BeanTipoArchivo tipoarchivo = new BeanTipoArchivo();
//                tipoarchivo.setNombre_tipo(res.getString(13));
//                archivo.setTipoarchivo(tipoarchivo);

                lista_archivos.add(archivo);
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
        System.out.print(lista_archivos);
        return lista_archivos;

    }
}
